home *** CD-ROM | disk | FTP | other *** search
/ A.C.E. 2 / ACE CD 2.iso / FILES / UTILS / GAMESDS3.DMS / GAMESDS3.adf / GDS_Examples.lha / Examples / misc / random.c < prev    next >
C/C++ Source or Header  |  1994-11-14  |  10KB  |  300 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <exec/types.h>
  5. #include <graphics/gfx.h>
  6. #include <graphics/gfxbase.h>
  7.  
  8. #include <proto/exec.h>
  9. #include <proto/graphics.h>
  10.  
  11. #include "GameSmith:GameSmith.h"
  12. #include "GameSmith:include/proto/all_regargs.h"
  13. #include "GameSmith:include/libraries/libptrs.h"
  14.  
  15. /*-------------------------------------------------------------------------*/
  16.  
  17. #define VIDEO_STEPS      30
  18. #define COLOR_GRADIENT   0x100            /* color change amount */
  19. #define VIDEO_REG         0x180            /* address of bg color reg */
  20. #define BGCOLOR         0xf00            /* max color value (bright red) */
  21. #define BGCOLOR_LONG      0x00ff0000      /* 8 bit color entry (bright red) */
  22. #define FGCOLOR_LONG      0x00ffff00      /* bright yellow */
  23. #define MIN_COLOR         0x000
  24.  
  25. /*-------------------------------------------------------------------------*/
  26. /* Function Prototypes                                                      */
  27.  
  28. void parser(int,char **);
  29. int setup(void);
  30. void build_copper(void);
  31. void plot_points(void);
  32. int check_close(void);
  33. void cleanup(void);
  34.  
  35. /*-------------------------------------------------------------------------*/
  36. /* some global variables                                                   */
  37.  
  38. int swidth,sheight,smode,copheight;
  39.  
  40. /*-------------------------------------------------------------------------*/
  41.  
  42. unsigned short copper_list[256];   /* enough for our custom copper list */
  43.  
  44. unsigned long ctbl[2] = {BGCOLOR_LONG,FGCOLOR_LONG};
  45.  
  46. struct gs_viewport vp =
  47.    {
  48.    NULL,                           /* ptr to next viewport */
  49.    ctbl,                           /* ptr to color table */
  50.    2,                              /* number of colors in table */
  51.    copper_list,                  /* ptr to user copper list */
  52.    0,0,0,0,0,                     /* height, width, depth, bmheight, bmwidth */
  53.    0,0,                           /* top & left viewport offsets */
  54.    0,0,                           /* X & Y bitmap offsets */
  55.    GSVP_ALLOCBM,                  /* flags (alloc bitmap) */
  56.    NULL,NULL,                     /* 2.xx & above compatibility stuff */
  57.    NULL,NULL,                     /* bitmap pointers */
  58.    NULL,                           /* future expansion */
  59.    0,0,0,0                        /* display clip (use nominal) */
  60.    };
  61.  
  62. struct display_struct display =
  63.    {
  64.    NULL,                           /* ptr to previous display view */
  65.    NULL,NULL,                     /* 2.xx & above compatibility stuff */
  66.    0,0,                           /* X and Y display offsets */
  67.    0,                              /* display mode ID */
  68.    4,4,                           /* sprite priorities (sprites in front of playfields) */
  69.    GSV_BRDRBLNK,                  /* flags (blank AGA/ECS borders) */
  70.    &vp,                           /* ptr to 1st viewport */
  71.    NULL                           /* future expansion */
  72.    };
  73.  
  74. /***************************************************************************/
  75.  
  76. main(argc,argv)
  77. int argc;
  78. char *argv[];
  79.  
  80. {
  81.    int err,end=0;
  82.  
  83.    if (gs_open_libs(GRAPHICS,0))   /* open AmigaDOS libs */
  84.       exit(01);               /* if can't open libs, abort */
  85.    parser(argc,argv);         /* parse command line args */
  86.    if (err=setup())            /* if couldn't get set up... abort program */
  87.       {
  88.       printf("\nSetup error: %d\n",err);
  89.       gs_close_libs();         /* close all libraries */
  90.       exit(02);
  91.       }
  92.    while (!end)               /* this shows off speed */
  93.       {
  94.       plot_points();
  95.       gs_show_display(&display,1);   /* make sure mouse blanker doesn't mess us up */
  96.       end=check_close();      /* end when user hits left mouse button */
  97.       }
  98.    cleanup();                  /* close & deallocate everything */
  99.    gs_close_libs();            /* close all libraries */
  100. }
  101.  
  102. /***************************************************************************/
  103.  
  104. void parser(argc,argv)
  105. int argc;
  106. char *argv[];
  107.  
  108. {
  109.    swidth=320;                  /* default width & height */
  110.    sheight=200;
  111.    copheight=200;
  112.    smode=0;                     /* default mode of lores no lace */
  113.    #ifdef NTSC_MONITOR_ID
  114.       if (GfxBase->LibNode.lib_Version >= 36)   /* if WB 2.0 or higher */
  115.          {               /* this defeats mode promotion on AGA machines */
  116.          if (ModeNotAvailable(NTSC_MONITOR_ID))
  117.             {
  118.             smode = PAL_MONITOR_ID;
  119.             sheight=256;
  120.             copheight=256;
  121.             }
  122.          else
  123.             {
  124.             smode = NTSC_MONITOR_ID;
  125.             }
  126.          }
  127.    #endif
  128.    if (argc >= 2)
  129.       {
  130.       if (!(stricmp(argv[1],"DBL")))   /* check for double scan */
  131.          {
  132.          #ifdef DBLNTSC_MONITOR_ID
  133.          if (GfxBase->LibNode.lib_Version >= 39)   /* if WB 3.0 or higher */
  134.             {               /* try for mode promoted AGA display */
  135.             if (!ModeNotAvailable(DBLNTSC_MONITOR_ID))
  136.                {
  137.                smode = DBLNTSC_MONITOR_ID;
  138.                copheight=400;
  139.                }
  140.             else if (!ModeNotAvailable(DBLPAL_MONITOR_ID))
  141.                {
  142.                smode = DBLPAL_MONITOR_ID;
  143.                sheight=256;
  144.                copheight=512;
  145.                }
  146.             }
  147.          #endif
  148.          }
  149.       else if (!(stricmp(argv[1],"DBLHIRES")))   /* check for hires double scan */
  150.          {
  151.          #ifdef DBLNTSC_MONITOR_ID
  152.          if (GfxBase->LibNode.lib_Version >= 39)   /* if WB 3.0 or higher */
  153.             {               /* try for mode promoted AGA display */
  154.             if (!ModeNotAvailable(DBLNTSC_MONITOR_ID))
  155.                {
  156.                swidth=640;
  157.                smode = DBLNTSC_MONITOR_ID;
  158.                copheight=400;
  159.                sheight=400;
  160.                }
  161.             else if (!ModeNotAvailable(DBLPAL_MONITOR_ID))
  162.                {
  163.                swidth=640;
  164.                smode = DBLPAL_MONITOR_ID;
  165.                sheight=256;
  166.                copheight=512;
  167.                }
  168.             smode|=HIRES|LACE;
  169.             }
  170.          #endif
  171.          }
  172.       else if (!(stricmp(argv[1],"HIRES")))   /* check for hires spec */
  173.          {
  174.          swidth=640;
  175.          sheight=400;
  176.          smode|=HIRES|LACE;
  177.          }
  178.       else if (!(stricmp(argv[1],"SUPER")))   /* check for superhires72 */
  179.          {
  180.          #ifdef SUPER72_MONITOR_ID
  181.          if (GfxBase->LibNode.lib_Version >= 36)
  182.             {
  183.             if (!ModeNotAvailable(SUPER72_MONITOR_ID | SUPERLACE_KEY))
  184.                {
  185.                smode=SUPER72_MONITOR_ID | SUPERLACE_KEY;
  186.                swidth=800;
  187.                sheight=600;
  188.                copheight=300;
  189.                }
  190.             }
  191.          #endif
  192.          }
  193.       }
  194. }
  195.  
  196. /***************************************************************************/
  197.  
  198. int setup()
  199.  
  200. {
  201.    vp.height = sheight;               /* set up display dimensions */
  202.    vp.width = swidth;
  203.    vp.depth = 1;
  204.    vp.bmheight = sheight;
  205.    vp.bmwidth = swidth;
  206.    display.modes = smode;
  207.    build_copper();                  /* build custom copper list */
  208.    if (gs_create_display(&display))
  209.       {
  210.       return(-1);
  211.       }
  212.    gs_show_display(&display,1);
  213.    return(0);
  214. }
  215.  
  216. /***************************************************************************/
  217.  
  218. void build_copper()
  219.  
  220. /* build a custom copper list of background color changes */
  221.  
  222. {
  223.    int cnt,cnt2=0,video_gradient;
  224.    short bgcolor,gradient,ctable[15];
  225.  
  226.    bgcolor=BGCOLOR;
  227.    gradient=0;
  228.    video_gradient=(copheight/3)/15;
  229.    for (cnt=0; cnt < 15; cnt++)            /* build copper list */
  230.       {
  231.       if (cnt)
  232.          {
  233.          copper_list[cnt2++]=UC_WAIT;      /* copper wait instruction */
  234.          copper_list[cnt2++]=gradient;      /* y coord to wait on */
  235.          copper_list[cnt2++]=0;            /* x coord to wait on */
  236.          }
  237.       ctable[cnt]=bgcolor;
  238.       copper_list[cnt2++]=UC_SETCOLOR;      /* set color register */
  239.       copper_list[cnt2++]=0;               /* register number */
  240.       copper_list[cnt2++]=ctable[cnt];      /* value for register */
  241.       gradient+=video_gradient;
  242.       bgcolor-=COLOR_GRADIENT;
  243.       if (bgcolor < MIN_COLOR)
  244.          bgcolor=0;
  245.       }
  246.    copper_list[cnt2++]=UC_WAIT;            /* copper wait instruction */
  247.    copper_list[cnt2++]=gradient;            /* y coord to wait on */
  248.    copper_list[cnt2++]=0;                  /* x coord to wait on */
  249.    copper_list[cnt2++]=UC_SETCOLOR;
  250.    copper_list[cnt2++]=0;                  /* color number */
  251.    copper_list[cnt2++]=0;                  /* color value */
  252.    gradient=((copheight/3)*2)-video_gradient;   /* build bottom color gradient */
  253.    for (cnt=14; cnt >= 0; cnt--)            /* build copper list */
  254.       {
  255.       copper_list[cnt2++]=UC_WAIT;         /* copper wait instruction */
  256.       copper_list[cnt2++]=gradient;         /* y coord to wait on */
  257.       copper_list[cnt2++]=0;               /* x coord to wait on */
  258.       copper_list[cnt2++]=UC_SETCOLOR;      /* set color register */
  259.       copper_list[cnt2++]=0;               /* register number */
  260.       copper_list[cnt2++]=ctable[cnt];      /* value for register */
  261.       gradient+=video_gradient;
  262.       }
  263.    copper_list[cnt2++]=UC_END;            /* end coppper list */
  264. }
  265.  
  266. /***************************************************************************/
  267.  
  268. void plot_points()
  269.  
  270. /* plot random points on the screen */
  271.  
  272. {
  273.    int cnt;
  274.  
  275.    for (cnt=0; cnt < 1000; cnt++)
  276.       _gs_plot(vp.bitmap1,_gs_random(swidth),_gs_random(sheight),1);
  277. }
  278.  
  279. /***************************************************************************/
  280.  
  281. int check_close()
  282.  
  283. /* check for user input */
  284.  
  285. {
  286.    if (gs_joystick(0) & (JOY_BUTTON1|JOY_BUTTON2))
  287.       return(1);
  288.    return(0);
  289. }
  290.  
  291. /***************************************************************************/
  292.  
  293. void cleanup()
  294.  
  295. /* release all resources and memory */
  296.  
  297. {
  298.    gs_remove_display(&display);
  299. }
  300.